package br.com.infoanalise.jsf.pety.repository;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

import org.springframework.orm.jpa.support.JpaDaoSupport;

import br.com.infoanalise.pety.domain.Jogador;
import br.com.infoanalise.pety.domain.Selecao;

@Named
public class SelecaoRepository extends JpaDaoSupport {
	
	public SelecaoRepository() {
		// metodo para poder ter IoC
	}

	@Inject
	public void setJPAEntityManagerFactory(EntityManagerFactory emf) {
		setEntityManagerFactory(emf);
	}

	@SuppressWarnings("unchecked")
	public List<Selecao> getSelecoesJPA() {
		return getJpaTemplate().find("from Selecao");
	}

	public Long getQtdSelecoes() {
		return (Long) getJpaTemplate().getEntityManagerFactory()
				.createEntityManager()
				.createQuery("select count(j) from Selecao s")
				.getSingleResult();
	}

	// @Transactional
	public void adicionaJPA(Selecao selecao) {
		getJpaTemplate().persist(selecao);
	}
	
	// @Transactional
	public void removeJPA(Selecao selecao) {
		getJpaTemplate().remove(selecao);
	}
	
	public Selecao findByPrimaryKey(Long id) {
		return getJpaTemplate().find(Selecao.class, id);
	}
	
	private EntityManager entityManager;

	public SelecaoRepository(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public void adiciona(Selecao selecao) {
		this.entityManager.persist(selecao);
		this.entityManager.flush();
	}

	public void remove(Selecao selecao) {
		this.entityManager.remove(selecao);
		Query query = this.entityManager
				.createQuery("select j from Jogador as j where j.selecao = :selecao");
		query.setParameter("selecao", selecao);
		List<Jogador> jogadores = query.getResultList();
		for (Jogador jogador : jogadores) {
			this.entityManager.remove(jogador);
		}
		this.entityManager.flush();
	}

	public Selecao procura(Long id) {
		return this.entityManager.find(Selecao.class, id);
	}

	public List<Selecao> getSelecoes() {
		Query query = this.entityManager
				.createQuery("select s from Selecao as s");
		return query.getResultList();
	}
}
